package cn.itcast.aspect;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

//@Aspect
@Component
public class TrimAdvice {

    @Around("execution(* cn.itcast.controller.*Controller.*(..))")
    public Object trim(ProceedingJoinPoint pjp) throws Throwable {
        //1.获取所有的参数
        Object[] args = pjp.getArgs();
        //2.遍历参数，判断参数是否是String类型，如果是，就trim一下,如果不是就继续遍历(递归)
        for (int i = 0; i < args.length; i++) {
            Object obj = getParamIsString(args[i]);
            args[i] = obj;
        }
        return pjp.proceed(args);
    }

    private Object getParamIsString(Object arg) throws Exception {
        if (arg != null) {
            //1.判断这个arg参数是否是String类型
            //获取arg的字节码对象
            Class<?> c = arg.getClass();
            if (c == String.class) {
                //是String类型的话,将String的值进行trim操作
                return ((String) arg).trim();
                //判断是不是基本类型,以及是不是以java开头的,都不是的话进行递归
            } else if (!c.getName().startsWith("java.") && !c.isPrimitive()) {
                //1.需要拿到arg的下一级进行递归
                Field[] fields = c.getDeclaredFields();
                //2.遍历所有的属性
                for (Field field : fields) {
                    //3.暴力反射
                    field.setAccessible(true);
                    //4.获取到arg对象对应的属性值
                    Object value = field.get(arg);
                    Object paramIsString = getParamIsString(value);
                    field.set(arg, paramIsString);
                }
                return arg;
            } else {
                return arg;
            }
        }

        return null;

    }
}
